#include<bits/stdc++.h> 
using namespace std;
//	一个链表有一系列存储不一定连续的结构体组成。我们假设诶个结构体保存了一个值和一个Next
//	指针。如今给定一个链表，你需要去排序，使得他们的值为递增
//1.每个输入包括一个测试用例，每个测试用例第一行为一个正整数N<100000，与一个头节点地址，
//	N是结点总数，每个结点都是5位正整数组成。NULL表示为-1
//2.接着N行，每行按照Address Key Next的结构描述。题目保证不存在环
//3.对于每个测试用例，按照输入一样的格式输出，并且结点有序
//4.数组排序 
struct Node{	//这题并不需要真正的链表结点，实际上就是一个模拟排序的过程，关键字只有key一个 
	int key, add, next;
}; 
bool cmp(Node a, Node b){
	return a.key<b.key;
}
int main(){	//这题最坑的地方在于给定的结点集里有很多是无用的不存在与链表的结点，所以不能上来就直接排序，而是要先走一遍链，然后再去排序 
	int N, start;
	cin>>N>>start;
	Node all_nodes[N];
	unordered_map<int, Node> mp;
	for(int i = 0;i<N;i++){
		scanf("%d %d %d",&all_nodes[i].add, &all_nodes[i].key, &all_nodes[i].next);
		mp[all_nodes[i].add] = all_nodes[i];
	}
	vector<Node> nodes;
	int now = start;
	while(true){
		if(now==-1) break;
		nodes.push_back(mp[now]);
		now = mp[now].next;
	}
	if(nodes.size()<1){
		if(start==-1) cout<<"0 -1"<<endl;
		else printf("%d %05d\n",0, start);
		return 0;
	}
	sort(nodes.begin(),nodes.end(),cmp);
	printf("%d %05d\n",nodes.size(),nodes[0].add);
	for(int i =0;i<nodes.size()-1;i++){
		printf("%05d %d %05d\n", nodes[i].add, nodes[i].key, nodes[i+1].add);
	}
	printf("%05d %d -1\n", nodes.back().add, nodes.back().key);
	return 0;
}
 